// dlist.h - 唯一的链表头文件，只定义链表结构体和函数
#ifndef DLIST_H  // 头文件保护宏（与文件名对应，避免重复包含）
#define DLIST_H

#include <stdlib.h>  // 包含 malloc/free 所需的头文件

// 双向链表节点结构体（唯一定义）
typedef struct DListNode {
    void* data;                // 节点存储的数据（支持任意类型，如客户端FD）
    struct DListNode* prev;    // 前驱节点指针
    struct DListNode* next;    // 后继节点指针
} DListNode;

// 双向链表结构体（唯一定义）
typedef struct DList {
    DListNode* head;           // 链表头节点
    DListNode* tail;           // 链表尾节点
    int size;                  // 链表长度（节点数量）
} DList;

// 链表操作函数声明（唯一声明，实现放在 dlist.c 中）
DList* dlist_init();                     // 初始化空链表，返回链表指针
void dlist_append(DList* list, void* data); // 向链表尾部添加节点
void dlist_remove(DList* list, void* data); // 从链表移除指定数据的节点
void dlist_destroy(DList* list);         // 销毁链表（释放所有节点和链表内存）
int dlist_get_size(DList* list);         // 获取链表长度
void dlist_traverse(DList* list, void (*callback)(void* data)); // 遍历链表

#endif  // DLIST_H  // 闭合头文件保护宏
